home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / Sample.cpp < prev    next >
C/C++ Source or Header  |  1999-08-08  |  2KB  |  114 lines

  1. #include "Sample.h"
  2.  
  3. #include "UtilStr.h"
  4. #include "V3.h"
  5. #include "R3Matrix.h"
  6.         
  7. Sample::Sample() {
  8.     mNext            = NULL;
  9.     mSampleTime        = -1;
  10. }
  11.  
  12. #define BINS_TO_COMPARE    10
  13.  
  14. void Sample::Assign( long inCurTime, const float inSample[], const Sample* inPrev, float inFalloff ) {
  15.     const float*    prev = NULL;
  16.     float            w, bin, sum;
  17.     long            j, i, idx;
  18.     bool            done = false;
  19.     
  20.     mSampleTime = inCurTime;
  21.  
  22.     if ( inPrev ) {
  23.         w = inFalloff * ((float) ( mSampleTime - inPrev -> mSampleTime ));
  24.         if ( w < 1.0 ) {
  25.             prev = inPrev -> mSample;
  26.             for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  27.                 bin = inSample[ i ];
  28.                 mSample[ i ] = w * bin + (1.0 - w) * prev[ i ];
  29.             }
  30.             done = true;
  31.         } 
  32.     }
  33.     
  34.     if ( ! done ) {
  35.         UtilStr::Move( mSample, inSample, sizeof( float ) * NUM_SAMPLE_BINS );
  36.     }
  37.     
  38.     // Calculate bass1
  39.     // Assign mBassLvl here -- choose the larger bins
  40.     char chosen[ NUM_SAMPLE_BINS ];
  41.     for ( i = 0; i < BINS_TO_COMPARE; i++ )
  42.         chosen[ i ] = 0;
  43.  
  44.     sum = 0;
  45.     for ( j = 0; j < 4; j++ ) {
  46.     
  47.         // Default to the bin not taken yet
  48.         for ( idx = 0; chosen[ idx ]; idx++ ) { 
  49.         }
  50.         bin = inSample[ idx ];
  51.         
  52.         // Find next largest bin, then 'take'/'choose' it
  53.         for ( i = idx + 1; i < BINS_TO_COMPARE; i++ ) {
  54.             if ( mSample[ i ] > bin && chosen[ i ] == 0 ) {
  55.                 bin = mSample[ i ];
  56.                 idx = i;
  57.             }
  58.         }
  59.         
  60.         sum += bin;
  61.         chosen[ idx ] = 1;
  62.     }
  63.     mBass[ 0 ] = sum;
  64.     
  65.     
  66.     // Calculate bass2
  67.     sum = 0;
  68.     for ( i = 0; i < 10; i++ ) {
  69.         sum += mSample[ i ];
  70.     }
  71.     mBass[ 1 ] = sum;
  72.     
  73.     
  74.     // Calculate bass3
  75.     sum = 0;
  76.     if ( inPrev ) {
  77.         if ( mSampleTime - inPrev -> mSampleTime < 500 ) {
  78.             w = 1.0 / ( (float) ( inCurTime - inPrev -> mSampleTime ) );
  79.             prev = inPrev -> mSample;
  80.             for ( i = 0; i < 16; i++ ) {
  81.                 bin = mSample[ i ] - prev[ i ];
  82.                 if ( bin > 0 )
  83.                     sum += w * bin;
  84.             }
  85.         }
  86.     }
  87.     mBass[ 2 ] = sum;
  88. }
  89.         
  90.         
  91.     /*
  92. void Sample::GenerateCords( V3* ioPts, float* inTail, V3& inOffset, R3Matrix& inT, float inScale, float inPersIntcpt ) {
  93.     float mag, x, y, z;
  94.  
  95.     for ( int i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  96.         mag = mSample[ i ];
  97.         x =        *inTail;        inTail++;
  98.         y =        *inTail;        inTail++;
  99.         z =        *inTail;        inTail++;
  100.         x +=    mag * *inTail;    inTail++;
  101.         y +=    mag * *inTail;    inTail++;
  102.         z +=    mag * *inTail;    inTail++;
  103.         ioPts -> mX = x - inOffset.mX;
  104.         ioPts -> mY = y - inOffset.mY;
  105.         ioPts -> mZ = z - inOffset.mZ;
  106.         ioPts -> transform( inT );
  107.         ioPts -> mX = inScale * ioPts -> mX / ( ioPts -> mZ + inPersIntcpt );
  108.         ioPts -> mY = inScale * ioPts -> mY / ( ioPts -> mZ + inPersIntcpt );
  109.         ioPts++;
  110.     }
  111. }
  112. */
  113.  
  114.